package com.dby.iphotoserver.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dby.iphotoserver.dto.Result;
import com.dby.iphotoserver.entity.Image;
import com.dby.iphotoserver.service.ImageService;
import com.dby.iphotoserver.utils.QiniuOssUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Tag(name = "图片管理")
@CrossOrigin
@RestController
public class ImageController {

    @Autowired
    private ImageService imageService;

    /**
     * 上传图片接口（支持多图片上传）
     */
    @Operation(summary = "上传图片")
    @PostMapping("/image/upload")
    public Result upload(@Parameter(description = "图片文件集") MultipartFile[] files) throws IOException {
        //用于存储获取的每一个图片对象
        List<Image> list = new ArrayList<>();
        //创建一个七牛OSS工具对象
        QiniuOssUtils ossUtils = new QiniuOssUtils();
        for (MultipartFile file : files) {
            //生成一个UUID作为key
            String key = UUID.randomUUID().toString();
            //上传文件到七牛云存储
            String url = ossUtils.upload(file.getInputStream(), key);
            //创建图片对象
            Image img = new Image();
            img.setUrl(url);
            img.setName(file.getOriginalFilename());
            img.setSize(file.getSize());
            //添加图片对象到集合中
            list.add(img);
        }
        //执行保存并返回结果
        return imageService.saveBatch(list) ? Result.ok().setMsg("上传成功") : Result.error().setMsg("上传失败");
    }

    /**
     * 图片分页列表查询
     */
    @Operation(summary = "图片分页列表查询")
    @GetMapping("/image/list")
    public Result list(@Parameter(description = "当前页码") @RequestParam(defaultValue = "1") Integer page,
                       @Parameter(description = "每页记录数") @RequestParam(defaultValue = "5") Integer limit) {
        //分页查询集合数据
        List<Image> list = imageService.list(new Page<Image>(page, limit));
        long count = imageService.count();
        return Result.ok().setData(list).setCount(count);
    }

    /**
     * 根据id删除图片同时删除云存储中的对应文件
     */
    @Operation(summary = "根据id删除图片")
    @DeleteMapping("/image/{id}")
    public Result delete(@Parameter(description = "图片id") @PathVariable Integer id) {
        //根据id查询图片对象
        Image image = imageService.getById(id);
        //创建一个七牛OSS工具对象
        QiniuOssUtils ossUtils = new QiniuOssUtils();
        //获取图片的key（地址的最后一段资源名称）
        String key = image.getUrl().substring(image.getUrl().lastIndexOf("/") + 1);
        //删除云存储中的文件
        ossUtils.delete(key);
        //删除数据库中的图片记录
        return imageService.removeById(id) ? Result.ok().setMsg("删除成功") : Result.error().setMsg("删除失败");
    }
    /**
     * 修改图片信息
     * @param img
     * @return
     */
    @Operation(summary = "修改图片")
    @PutMapping("/image")
    public Result modify(@RequestBody Image img){
        return imageService.updateById(img) ? Result.ok().setMsg("修改成功") : Result.error().setMsg("修改失败");
    }
    /**
     * 根据id修改图片名称
     */
    @Operation(summary = "修改图片名称")
    @PutMapping("/image/rename")
    public Result rename(@Parameter(description = "图片id") Integer id,
                            @Parameter(description = "图片名称") String name){
    // 先根据ID获取图片对象
    Image img = imageService.getById(id);
    // 检查img是否为null
    if (img == null) {
        // 如果为null，返回一个错误结果
        return Result.error().setMsg("找不到指定ID的图片");
    }
    // 设置新的名字
    img.setName(name);
    // 更新图片信息
    return imageService.updateById(img) ? Result.ok().setMsg("修改成功") : Result.error().setMsg("修改失败");
    }


}
